﻿using System;
using System.Collections.Generic;
using System.Text;

namespace ScreenCapture.Base.Services
{
    public interface IBinder
    {
        /// <summary>
        /// 注册一个单例对象
        /// </summary>
        /// <typeparam name="T">注册的对象类型</typeparam>
        void BindSingleton<T>();
        /// <summary>
        /// 将TFrom类型 绑定到 TTarget类型上,默认是单例模式,就是永远返回相同的额TTarget对象
        /// </summary>
        /// <typeparam name="TFrom"></typeparam>
        /// <typeparam name="TTarget"></typeparam>
        /// <param name="Singleton"></param>
        void Bind<TFrom, TTarget>(bool Singleton = true) where TTarget : TFrom;

        /// <summary>
        /// 允许我们提供一个函数来传感对象,这个函数会在需要T类型的对象时被调用
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="Function"></param>
        /// <param name="Singleton"></param>
        void Bind<T>(Func<T> Function, bool Singleton = true);

        /// <summary>
        /// 以单例的方式同时绑定接口TInterface以及TClass对象上
        /// </summary>
        /// <typeparam name="TInterface"></typeparam>
        /// <typeparam name="TClass"></typeparam>
        void BindAsInterfaceAndClass<TInterface, TClass>() where TClass : TInterface;

        /// <summary>
        /// 获取一个已经注册的类型T的对象.
        /// 至于为什么默认设置是Singleton=True,这个可能是因为在许多情况下,单例都是一个很有用的设计模式.
        /// 对于某些类型的对象,我们可能只希望在应用程序中有一个实例,例如服务类,工厂类或者配置类.此外,
        /// 使用单例也可以节省资源和提高性能,因为我们可以避免反复创建和销毁对象.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        T Get<T>();
    }
}
